package com.example.demo.day0303;
import com.example.demo.day0302.Student;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class DemoReflect1 {
    public static void main(String[] args){
            try {
               Class clazz = Class.forName("com.example.demo.day0302.Student");
                try {
                    Object obj = clazz.newInstance();//用newInstance来创造对象
                    System.out.println(obj instanceof Student ? ((Student) obj) : null);//三目运算
                    Student student = (Student) obj;//相当于调用Student类的无参公有的构造方法

                    Constructor c = clazz.getConstructor(String.class);// 指定获取有一个参数且为String类型的公有的构造方法
                    Student stu1 = (Student)c.newInstance("first highschool");//newInstance实例化对象，相当于调用public Student (String school)
                    System.out.println(stu1.school);

                    //通过反射机制可以强制的调用私有的构造方法
                    Constructor constructor = clazz.getDeclaredConstructor(String.class, int.class);//指定获取有两个参数（String，int类型）的构造方法
                    constructor.setAccessible(true);//!解除私有的封装，之后就可以对这个私有方法强制调用
                    Student stu2 = (Student)constructor.newInstance("Tom",15);
                    System.out.println(stu2.name + " is "+stu2.age + " years old ");

//                    Method[] ms = clazz.getMethods();//获取类的所有的公有方法
                    Method[] ms = clazz.getDeclaredMethods();//获取类的所有方法,包括私有方法
                    for (Method m : ms){
                        System.out.println("method is "+ m.getName());
                        System.out.println("return "+ m.getReturnType());
                        System.out.println("qualifier is "+ m.getModifiers());

                        Class[] pcs = m.getParameterTypes();//获取方法的参数类型，是数组类型的数据
                        if (pcs != null && pcs.length > 0){//遍历有参数的方法的参数类型
                            for (Class pc : pcs){
                                System.out.println("parameter type is" + pc.getName());
                            }
                        }
                        System.out.println("===========================");
                    }


                } catch (Exception e) {
                    e.printStackTrace();
                }
            }  catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

